// Symbol原始数据类型

// // shared.js ======================

// const cache = {}

// // a.js ===========================

// cache['foo'] = Math.random()
// cache['a_foo'] = Math.random()

// // b.js ===========================

// cache['foo'] = '123'
// cache['b_foo'] = '123'

// console.log(cache)

const s = Symbol()
console.log(s)
console.log(typeof s)

console.log(Symbol() === Symbol())

console.log(Symbol('foo'))
console.log(Symbol('bar'))
console.log(Symbol('baz'))


const obj = {
    [Symbol()]: '122'
}
console.log(obj)


// a.js ================================

const name = Symbol()
const person = {
    [name]: 'liuchao',
    say(){
        console.log(this[name])
    }
}

// b.js ================
// console.log(person[Symbol()]) //得不到结果
person.say()



// Symbol补充
// 唯一性
console.log(
    Symbol() === Symbol(),
    Symbol('foo') === Symbol('foo'),
)

// 全局服用一个相同的Symbol值 方式:1. 全局变量 2. Symbol.for方法
const s1 = Symbol.for('foo')
const s2 = Symbol.for('foo')
console.log(s1 === s2)
// ***** 特别注意: Symbol.for方法中维护的注册表是字符串string关联的, 非string也会转换成string
console.log(
    Symbol.for(true) === Symbol.for('true')
)

// Symbol提供的Symbol常量
console.log(Symbol.iterator)
console.log(Symbol.hasInstance)

const obj1 = {
    [Symbol.toStringTag]: 'Symbol'
}

console.log(obj1.toString())


// Symbol作为键值通过for in循环无法拿到 Object.key()也无法获取到 字符串化JSON.stringigy也会被忽略掉

const obj2 = {
    [Symbol()]: '222',
    name: 'liuchao'
}
for(let key in obj2){
    console.log(key)
}
console.log(Object.keys(obj2))
console.log(JSON.stringify(obj2))

// 可以通过Object.getOwnPropertySymbols()
console.log(Object.getOwnPropertySymbols(obj2))










